#include <iostream>
#include <assert.h>

using namespace std;

void* Memcpy(void* des, void* sur, size_t num)
{
    void* ret = des;
    assert(sur);
    while(num--)
    {
        (*(char*)des) = *((char*)sur);
        sur = (char*)sur + 1;
        des = (char*)des + 1;
    }

    return ret;
}

void* Memmove(void* des, void* sur, size_t num)
{
    void* ret = des;
    if(des < sur | (char*)des > (char*)sur + num)
    {
        while(num--)
        {
            (*(char*)des) = *((char*)sur);
            sur = (char*)sur + 1;
            des = (char*)des + 1;
        }
    }
    else
    {
        des = (char*)des + num - 1;
        sur = (char*)sur + num - 1;
        while(num--)
        {
            (*(char*)des) = (*(char*)sur);
            des = (char*)des - 1;
            sur = (char*)sur - 1;
        }
    }
    return ret;
}



int main()
{
    // char a1[] = "hello world";
    // char a2[10] = "";
    // Memcpy(a2, a1, 5);
    // cout << a2 << endl;

    char a[] = "memmove good";
    Memmove(a+5, a+3, 5);
    cout << a << endl;
 
    return 0;
}